package utils

import (
	"crypto/aes"
	"crypto/cipher"
	"encoding/hex"
	"fmt"
    "crypto/md5"
	"strings"
)

//小写
func Md5Encode(data string) string {
	h := md5.New()
	h.Write([]byte(data))
	tempStr := h.Sum(nil)
	return hex.EncodeToString(tempStr)
}

//大写
func MD5Encode(data string) string {
	return strings.ToUpper(Md5Encode(data))
}

//加密
func MakePassword(plainpwd, salt string) string {
	return Md5Encode(plainpwd + salt)
}

//解密
func ValidPassword(plainpwd, salt string, password string) bool {
	md := Md5Encode(plainpwd + salt)
	fmt.Println(md + "				" + password)
	return md == password
}


// EncryptCBCString 使用AES的CBC模式对输入的字符串进行加密，返回加密后的十六进制字符串表示
func EncryptCBCString(plaintext string, key string) (string, error) {
    // 将输入的字符串转换为字节切片
    plaintextBytes := []byte(plaintext)
    keyBytes := []byte(key)

    // 创建AES加密算法的实例
    block, err := aes.NewCipher(keyBytes)
    if err!= nil {
        return "", err
    }

    // 初始向量，长度为AES块大小
    iv := make([]byte, aes.BlockSize)
    for i := range iv {
        iv[i] = 0
    }

    // 使用CBC模式进行加密
    ciphertext := make([]byte, aes.BlockSize+len(plaintextBytes))
    copy(ciphertext[:aes.BlockSize], iv)
    cbc := cipher.NewCBCEncrypter(block, iv)
    cbc.CryptBlocks(ciphertext[aes.BlockSize:], plaintextBytes)

    // 将加密后的字节切片转换为十六进制字符串返回
    return fmt.Sprintf("%x", ciphertext), nil
}

// DecryptCBCString 使用AES的CBC模式对输入的十六进制字符串表示的密文进行解密，返回解密后的字符串
func DecryptCBCString(ciphertext string, key string) (string, error) {
    // 将十六进制字符串表示的密文转换为字节切片
    ciphertextBytes, err := hex.DecodeString(ciphertext)
    if err!= nil {
        return "", err
    }
    keyBytes := []byte(key)

    // 创建AES加密算法的实例
    block, err := aes.NewCipher(keyBytes)
    if err!= nil {
        return "", err
    }

    // 提取初始向量
    iv := ciphertextBytes[:aes.BlockSize]
    ciphertextBytes = ciphertextBytes[aes.BlockSize:]

    // 使用CBC模式进行解密
    plaintext := make([]byte, len(ciphertextBytes))
    cbcDecrypter := cipher.NewCBCDecrypter(block, iv)
    cbcDecrypter.CryptBlocks(plaintext, ciphertextBytes)

    // 将解密后的字节切片转换为字符串返回
    return string(plaintext), nil
}

// func main() {
//     plaintext := "Hello, World!"
//     key := "12345678901234567890123456789012"

//     // 加密
//     encryptedText, err := EncryptCBCString(plaintext, key)
//     if err!= nil {
//         fmt.Println("加密出错:", err)
//         return
//     }
//     fmt.Printf("加密后的密文: %s\n", encryptedText)

//     // 解密
//     decryptedText, err := DecryptCBCString(encryptedText, key)
//     if err!= nil {
//         fmt.Println("解密出错:", err)
//         return
//     }
//     fmt.Printf("解密后的明文: %s\n", decryptedText)
// }